unit MantenimientoReservasSenhasUt;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Grids, Vcl.DBGrids, Vcl.StdCtrls,
  Vcl.Buttons, Vcl.ComCtrls, Vcl.ExtCtrls, Vcl.Mask, Vcl.DBCtrls, Data.DB,
  DBAccess, Uni, MemDS;

type
  TMantenimientoReservasSenhas = class(TForm)
    Paginas: TPageControl;
    Consulta: TTabSheet;
    Mantenimiento: TTabSheet;
    pnlTitulo: TPanel;
    lblConsulta: TLabel;
    pnlFiltros: TPanel;
    lblCliente: TLabel;
    lblDesde: TLabel;
    lblHasta: TLabel;
    cbxFecha: TCheckBox;
    dbCodCliente: TEdit;
    dbDescCliente: TEdit;
    dbDesdeC: TDateTimePicker;
    dbHastaC: TDateTimePicker;
    btnBuscarClientes: TBitBtn;
    pnlBotones: TPanel;
    btnBuscar: TBitBtn;
    btnNuevo: TBitBtn;
    btnModificar: TBitBtn;
    btnCerrar: TBitBtn;
    dbgConsultaReservas: TDBGrid;
    pnlTitulo2: TPanel;
    lblMantenimiento: TLabel;
    pnlDatos: TPanel;
    rgDatos: TGroupBox;
    lblCampanhaPresu: TLabel;
    dbDescCliente2: TEdit;
    btnGuardar: TBitBtn;
    btnCancelar: TBitBtn;
    Label3: TLabel;
    rgDatosReserva: TGroupBox;
    Label1: TLabel;
    lblSenhaSug: TLabel;
    lblVencimiento: TLabel;
    dbFecVencimiento: TDateTimePicker;
    DBGrid1: TDBGrid;
    qryReserva: TUniQuery;
    qryReservaDet: TUniQuery;
    qryReservaDetREGISTRO: TIntegerField;
    qryReservaDetID_PAQUETE: TIntegerField;
    qryReservaDetDENOMINACION: TStringField;
    qryReservaDetID_PAQUETE_FECHAS: TIntegerField;
    qryReservaDetFECHA_PARTIDA: TDateField;
    qryReservaDetFECHA_LLEGADA: TDateField;
    qryReservaDetCANTIDAD_PERSONAS: TIntegerField;
    qryReservaDetESTADO_REGISTRO: TStringField;
    qryReservaDetID_PAQUETE_COSTOS: TIntegerField;
    qryReservaDetCOSTO: TFloatField;
    qryReservaDetOPCION: TIntegerField;
    qryReservaDetID_RESERVA: TIntegerField;
    dsReserva: TUniDataSource;
    dsReservaDet: TUniDataSource;
    qryNombreCliente: TUniQuery;
    qryNombreClienteID_CLIENTE: TIntegerField;
    qryNombreClienteNOMBRE_COMPLETO: TStringField;
    dbTotal: TEdit;
    dbSenhaSug: TEdit;
    qryMov: TUniQuery;
    qryMovREGISTRO: TIntegerField;
    qryMovID_RESERVA: TIntegerField;
    qryMovDEBE: TFloatField;
    qryMovHABER: TFloatField;
    qryMovOPERADOR: TStringField;
    qryMovFECHA_CARGA: TDateField;
    dbSenha: TDBEdit;
    qryReservaID_RESERVA: TIntegerField;
    qryReservaID_CLIENTE: TIntegerField;
    qryReservaNRO_DOCUMENTO: TStringField;
    qryReservaNOMBRE_COMPLETO: TStringField;
    qryReservaSENHA: TFloatField;
    qryReservaVENCIMIENTO: TDateField;
    qryReservaESTADO_RESERVA: TStringField;
    procedure dbCodClienteExit(Sender: TObject);
    procedure btnBuscarClientesClick(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure btnBuscarClick(Sender: TObject);
    procedure btnNuevoClick(Sender: TObject);
    procedure btnCerrarClick(Sender: TObject);
    procedure CalcularTotalGrilla;
    procedure btnModificarClick(Sender: TObject);
    procedure btnGuardarClick(Sender: TObject);
    procedure btnCancelarClick(Sender: TObject);
    procedure dbgConsultaReservasDblClick(Sender: TObject);
    procedure cbxFechaClick(Sender: TObject);
    procedure dbCodClienteKeyPress(Sender: TObject; var Key: Char);
    procedure dbSenhaKeyPress(Sender: TObject; var Key: Char);
  private
    vSenhaAnt : Double;
  public
    { Public declarations }
  end;

var
  MantenimientoReservasSenhas: TMantenimientoReservasSenhas;

implementation

{$R *.dfm}

uses DMTuristikUt;

procedure TMantenimientoReservasSenhas.btnBuscarClick(Sender: TObject);
var
  vSqlWhere : String;
  procedure VerificarCondPrevia;
  begin
    if vSqlWhere <> EmptyStr then
      vSqlWhere := vSqlWhere + ' AND ';
  end;
begin
  qryReserva.Close;

  if cbxFecha.Checked then
  begin
    if dbHastaC.DateTime < dbDesdeC.DateTime then
    begin
      ShowMessage('La fecha hasta debe ser mayor a la fecha desde');
      Exit;
    end;
  end;

  vSqlWhere := EmptyStr;

  vSqlWhere := ' R.ESTADO_RESERVA IN (''N'',''S'') AND R.VENCIMIENTO >= ''' + FormatDateTime('mm/dd/yyyy',Date) + '''';

  if dbCodCliente.Text <> EmptyStr then
  begin
    VerificarCondPrevia;
    vSqlWhere := vSqlWhere + ' C.NRO_DOCUMENTO = ' + QuotedStr(dbCodCliente.Text);
  end;

  if cbxFecha.Checked then
  begin
    VerificarCondPrevia;
    vSqlWhere := vSqlWhere + ' R.FECHA_RESERVA between ''' + FormatDateTime('mm/dd/yyyy',dbDesdeC.DateTime) +
                 ''' and ''' + FormatDateTime('mm/dd/yyyy',dbHastaC.DateTime) + '''';
  end;

  ReemplazarWhere(qryReserva.SQL, vSqlWhere);
  qryReserva.Open;
  if qryReserva.IsEmpty then
  begin
    ShowMessage('No se encontraron registros');
    dbCodCliente.SetFocus;
  end;
end;

procedure TMantenimientoReservasSenhas.btnBuscarClientesClick(Sender: TObject);
begin
  dbCodCliente.Text := ShowBuscarClientes('');
  dbCodClienteExit(Self);
end;

procedure TMantenimientoReservasSenhas.btnCancelarClick(Sender: TObject);
begin
  qryReserva.Cancel;
  qryReservaDet.Close;
  qryNombreCliente.Close;
  Paginas.ActivePageIndex := 0;
  btnBuscarClientes.SetFocus;
end;

procedure TMantenimientoReservasSenhas.btnCerrarClick(Sender: TObject);
begin
  Self.Close;
end;

procedure TMantenimientoReservasSenhas.btnGuardarClick(Sender: TObject);
var
  vMonto : Double;
begin
  if dbSenha.Text = EmptyStr then
  begin
    ShowMessage('Debe ingresar un monto.');
    dbSenha.SetFocus;
    Exit;
  end;

  if qryReservaSENHA.AsFloat <> vSenhaAnt then
  begin
    qryMov.Open;
    qryMov.Append;
    qryMovID_RESERVA.AsInteger := qryReservaID_RESERVA.AsInteger;
    if qryReservaSENHA.AsFloat > vSenhaAnt then
    begin
      vMonto := qryReservaSENHA.AsFloat - vSenhaAnt;
      qryMovDEBE.AsFloat := vMonto;
      qryMovHABER.AsFloat := 0;
    end
    else
    begin
      vMonto := vSenhaAnt - qryReservaSENHA.AsFloat;
      qryMovDEBE.AsFloat := 0;
      qryMovHABER.AsFloat := vMonto;
    end;
    qryMovOPERADOR.AsString := LogUSUARIO_NOMBRE;

    if qryReservaSENHA.AsFloat > 0 then
      qryReservaESTADO_RESERVA.AsString := 'S'
    else
      qryReservaESTADO_RESERVA.AsString := 'N';

    DMTuristik.DBTuristik.StartTransaction;
    try

      qryReserva.ApplyUpdates();
      qryMov.ApplyUpdates();
      DMTuristik.DBTuristik.Commit;
    except
      Application.MessageBox('ERROR'+chr(13)+'No se pudo guardar en la base de datos'+chr(13)+'Contacte con el Administrador del Sistema','Error',mb_ok + mb_IconStop);
      DMTuristik.DBTuristik.Rollback;
      qryReserva.CancelUpdates;
      qryMov.CancelUpdates;
    end;
  end;
  qryReservaDet.Close;
  qryReserva.Close;
  qryMov.Close;
  Paginas.ActivePageIndex := 0;
  btnBuscarClientes.SetFocus;
end;

procedure TMantenimientoReservasSenhas.btnModificarClick(Sender: TObject);
begin
  btnModificar.Tag := 1;
  vSenhaAnt := 0;
  if not qryReserva.IsEmpty then
  begin
    if qryReservaSENHA.AsFloat > 0 then
    begin
      vSenhaAnt := qryReservaSENHA.AsFloat;
      qryReservaDet.Close;
      ReemplazarWhere(qryReservaDet.SQL, ' RD.ESTADO_REGISTRO = ''A'' AND RD.ID_RESERVA = ' + qryReservaID_RESERVA.AsString);
      qryReservaDet.Open;
      dbDescCliente2.Text := qryReservaNOMBRE_COMPLETO.AsString;
      dbFecVencimiento.Date := qryReservaVENCIMIENTO.AsDateTime;
      CalcularTotalGrilla;
      Paginas.ActivePageIndex := 1;
      qryReserva.Edit;
      dbSenha.SetFocus;
    end
    else
      btnNuevoClick(Self);
  end
  else
  begin
    ShowMessage('Debe seleccionar una reserva.');
    btnBuscarClientes.SetFocus;
    Exit;
  end;
end;

procedure TMantenimientoReservasSenhas.btnNuevoClick(Sender: TObject);
begin
  btnModificar.Tag := 0;
  if not qryReserva.IsEmpty then
  begin
    if qryReservaSENHA.AsFloat > 0 then
    begin
      ShowMessage('La reserva ya ha sido senhada.');
      btnBuscarClientes.SetFocus;
      Exit;
    end
    else
    begin
      qryReservaDet.Close;
      ReemplazarWhere(qryReservaDet.SQL, ' RD.ESTADO_REGISTRO = ''A'' AND RD.ID_RESERVA = ' + qryReservaID_RESERVA.AsString);
      qryReservaDet.Open;
      dbDescCliente2.Text := qryReservaNOMBRE_COMPLETO.AsString;
      dbFecVencimiento.Date := qryReservaVENCIMIENTO.AsDateTime;
      CalcularTotalGrilla;
      qryReserva.Edit;
      Paginas.ActivePageIndex := 1;
    end;
  end
  else
  begin
    ShowMessage('Debe seleccionar una reserva.');
    btnBuscarClientes.SetFocus;
    Exit;
  end;
end;

procedure TMantenimientoReservasSenhas.dbCodClienteExit(Sender: TObject);
begin
  if dbCodCliente.Text <> EmptyStr then
  begin
    qryNombreCliente.Close;
    ReemplazarWhere(qryNombreCliente.SQL, ' c.estado_registro = ''A'' and c.nro_documento = ' + QuotedStr(dbCodCliente.Text));
    qryNombreCliente.Open;
    dbDescCliente.Text := qryNombreClienteNOMBRE_COMPLETO.AsString;
  end
  else
    dbCodCliente.Text := '';
end;

procedure TMantenimientoReservasSenhas.dbCodClienteKeyPress(Sender: TObject;
  var Key: Char);
begin
  if not CharInSet(UpCase(Key),[#8,'0'..'9','-']) then
  begin
    Key:= #0;
    MessageBeep(MB_ICONERROR);
  end;
end;

procedure TMantenimientoReservasSenhas.dbgConsultaReservasDblClick(
  Sender: TObject);
begin
  btnModificarClick(Self);
end;

procedure TMantenimientoReservasSenhas.dbSenhaKeyPress(Sender: TObject;
  var Key: Char);
begin
  if not CharInSet(UpCase(Key),[#8,'0'..'9']) then
  begin
    Key:= #0;
    MessageBeep(MB_ICONERROR);
  end;
end;

procedure TMantenimientoReservasSenhas.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
  qryNombreCliente.Close;
  qryReserva.Close;
  qryReservaDet.Close;
  Action := caFree;
end;

procedure TMantenimientoReservasSenhas.FormShow(Sender: TObject);
begin
  Paginas.ActivePageIndex := 0;
  dbDesdeC.Date := Date;
  dbHastaC.Date := Date;
  dbCodCliente.SetFocus;
end;

procedure TMantenimientoReservasSenhas.CalcularTotalGrilla;
var
  vTotal: Double;
begin
  vTotal := 0;
  qryReservaDet.First;
  while not qryReservaDet.Eof do
  begin
    vTotal := vTotal + (qryReservaDetCOSTO.AsFloat * qryReservaDetCANTIDAD_PERSONAS.AsInteger);
    qryReservaDet.Next;
  end;
  dbTotal.Text := FormatFloat('###.###.###.###.###,##',vTotal);
  dbSenhaSug.Text := FormatFloat('###.###.###.###.###,##',(vTotal / 2));
end;

procedure TMantenimientoReservasSenhas.cbxFechaClick(Sender: TObject);
begin
  if cbxFecha.Checked then
  begin
    dbDesdeC.Enabled := True;
    dbHastaC.Enabled := True;
  end
  else
  begin
    dbDesdeC.Enabled := False;
    dbHastaC.Enabled := False;
  end;
end;

end.
